home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / fileutil / fileutils-3.16.tar.gz / fileutils-3.16.tar / fileutils-3.16 / lib / rmdir.c < prev    next >
C/C++ Source or Header  |  1996-11-04  |  2KB  |  87 lines

  1. /* BSD compatible remove directory function for System V
  2.    Copyright (C) 1988, 1990 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software Foundation,
  16.    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  17.  
  18. #if HAVE_CONFIG_H
  19. # include <config.h>
  20. #endif
  21.  
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24.  
  25. #include <errno.h>
  26. #ifndef errno
  27. extern int errno;
  28. #endif
  29.  
  30. #if STAT_MACROS_BROKEN
  31. # undef S_ISDIR
  32. #endif
  33.  
  34. #if !defined(S_ISDIR) && defined(S_IFDIR)
  35. # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
  36. #endif
  37.  
  38. /* rmdir adapted from GNU tar.  */
  39.  
  40. /* Remove directory DPATH.
  41.    Return 0 if successful, -1 if not.  */
  42.  
  43. int
  44. rmdir (dpath)
  45.      char *dpath;
  46. {
  47.   int cpid, status;
  48.   struct stat statbuf;
  49.  
  50.   if (stat (dpath, &statbuf) != 0)
  51.     return -1;            /* errno already set */
  52.  
  53.   if (!S_ISDIR (statbuf.st_mode))
  54.     {
  55.       errno = ENOTDIR;
  56.       return -1;
  57.     }
  58.  
  59.   cpid = fork ();
  60.   switch (cpid)
  61.     {
  62.     case -1:            /* cannot fork */
  63.       return -1;        /* errno already set */
  64.  
  65.     case 0:            /* child process */
  66.       execl ("/bin/rmdir", "rmdir", dpath, (char *) 0);
  67.       _exit (1);
  68.  
  69.     default:            /* parent process */
  70.  
  71.       /* Wait for kid to finish.  */
  72.  
  73.       while (wait (&status) != cpid)
  74.     /* Do nothing.  */ ;
  75.  
  76.       if (status & 0xFFFF)
  77.     {
  78.  
  79.       /* /bin/rmdir failed.  */
  80.  
  81.       errno = EIO;
  82.       return -1;
  83.     }
  84.       return 0;
  85.     }
  86. }
  87.